package com.alangyun.remind.service.excel;

import java.util.HashMap;
import java.util.Map;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

import com.alangyun.remind.error.MindException;
import com.alangyun.remind.repository.data.NameTerm;
import com.alangyun.remind.repository.data.TalentCaution;
import com.alangyun.remind.repository.data.TalentDataset;
import com.alangyun.remind.utils.Utility;

public class TalentCautionReader extends AbstractExcelReader {
	private static final int ROW_OFFSET = 1;

	private String catNames(String... names) {
		String ret = "";
		String token = "";
		for (String name : names) {
			if (Utility.emptyOrWhitespace(name))
				continue;

			ret = ret + token + name;
			token = "-";
		}
		return ret;
	}

	@Override
	protected ParseResult readSheet(Sheet sheet) {

		ParseResult ret = new ParseResult();

		int rowIndex = sheet.getFirstRowNum();
		int rowCount = sheet.getLastRowNum();

		TalentDataset dataset = TalentDataset.create();
		ret.setObject(dataset);

		Map<String, NameTerm> termMap = new HashMap<>();// 构建索引用
		int increment = 0;

		// 循环处理从Excel读取的数据
		for (int index = rowIndex + ROW_OFFSET; index <= rowCount; index++) {
			Row row = sheet.getRow(index);
			if (row == null)
				break;

			int colIndex = row.getFirstCellNum();
			try {
				
				String id=PoiUtils.getStringValue(row.getCell(colIndex++));
				String name=PoiUtils.getStringValue(row.getCell(colIndex++));
				if(name==null||name.trim().length()==0)
					continue;

				TalentCaution data = new TalentCaution();
				data.setId(id); // 人员编号
				data.setName(name);// 姓名
				String unit = PoiUtils.getStringValue(row.getCell(colIndex++));// 单位
				String depart = PoiUtils.getStringValue(row.getCell(colIndex++));// 部门
				depart = depart == null ? "" : depart.trim();
				data.setDepartType(PoiUtils.getStringValue(row.getCell(colIndex++)));// 部门类别
				String classGrp = PoiUtils.getStringValue(row.getCell(colIndex++));// 班组/处室
				classGrp = classGrp == null ? "" : classGrp.trim();
				String job01 = PoiUtils.getStringValue(row.getCell(colIndex++));// 岗位大类
				job01 = job01 == null ? "" : job01.trim();
//				String job02 = PoiUtils.getStringValue(row.getCell(colIndex++));// 岗位中类
//				job02 = job02 == null ? "" : job02.trim();
//				String job03 = PoiUtils.getStringValue(row.getCell(colIndex++));// 岗位小类
//				job03 = job03 == null ? "" : job03.trim();
				data.setGender(PoiUtils.getStringValue(row.getCell(colIndex++)));// 性别
				data.setBirthday(PoiUtils.getDatetimeValue(row.getCell(colIndex++)));// 出生年月
				data.setYearOld(PoiUtils.getIntValue(row.getCell(colIndex++)));// 年龄
				data.setEduDate(PoiUtils.getDatetimeValue(row.getCell(colIndex++)));// 最高学历毕业时间
				data.setSchool(PoiUtils.getStringValue(row.getCell(colIndex++)));// 最高学历毕业学校
				data.setSubject(PoiUtils.getStringValue(row.getCell(colIndex++)));// 最高学历所学专业
				data.setEduType(PoiUtils.getStringValue(row.getCell(colIndex++)));// 最高学历类别
				data.setHighEdu(PoiUtils.getStringValue(row.getCell(colIndex++)));// 最高学历
				data.setHighDegree(PoiUtils.getStringValue(row.getCell(colIndex++)));// 最高学位
				data.setProfessionalYears(PoiUtils.getIntValue(row.getCell(colIndex++)));// 本专业工作年限

//				data.setZjjb(PoiUtils.getStringValue(row.getCell(colIndex++)));// 专家级别
//				data.setZjlb(PoiUtils.getStringValue(row.getCell(colIndex++)));// 专家类别
				data.setTechName(PoiUtils.getStringValue(row.getCell(colIndex++)));// 专业技术资格名称
				data.setTechSerial(PoiUtils.getStringValue(row.getCell(colIndex++)));// 专业技术资格系列
				String prof = PoiUtils.getStringValue(row.getCell(colIndex++));// 专业技术资格等级
				prof = prof == null ? "" : prof.trim();
				data.setTechLevelDate(PoiUtils.getDatetimeValue(row.getCell(colIndex++)));// 取得资格时间
				data.setSkillAuditType(PoiUtils.getStringValue(row.getCell(colIndex++)));// 技能鉴定工种
				data.setSkillLevelName(PoiUtils.getStringValue(row.getCell(colIndex++)));// 技能等级
				data.setSkillDate(PoiUtils.getDatetimeValue(row.getCell(colIndex++)));// 技能资格获取时间

				data.setSxyy(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 数学运用
				data.setYylj(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 言语理解
				data.setPdtl(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 判断推理
				data.setZlfx(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 资料分析
				data.setYbnl(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 一般能力
				data.setQjys(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 全局意识
				data.setRwgl(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 任务管理
				data.setGtxt(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 沟通与协调
				data.setZdtr(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 指导他人
				data.setXxnl(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 学习能力
				data.setTysrl(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 通用胜任力
				data.setYtlj(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 意图理解
				data.setWzbd(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 文字表达
				data.setZcfw(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 支持与服务
				data.setZysrl(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 专业胜任力
				data.setZhsrl(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 综合胜任力
				data.setZyll(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 专业理论
				data.setZyjn(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 专业技能
				data.setZyzsjn(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 专业知识和技能
				data.setZhzyhnl(PoiUtils.getDoubleValue(row.getCell(colIndex++)));// 综合专业能力水平
				data.setNldj(PoiUtils.getStringValue(row.getCell(colIndex++)));// 能力定级（对应在九宫格，根据高中低）
				data.setZtppd(PoiUtils.getStringValue(row.getCell(colIndex++)));// 整体匹配度
				data.setRecentYearsPerformance(PoiUtils.getDoubleValue(row.getCell(colIndex++)));//近三年绩效
				data.setSndjx(PoiUtils.getStringValue(row.getCell(colIndex++)));// 上年度绩效
				data.setShdjxdj(PoiUtils.getStringValue(row.getCell(colIndex++)));// 上年度绩效等级（对应在九宫格，根据高中低）
				data.setJgg(PoiUtils.getIntValue(row.getCell(colIndex++)));// 九宫格
				data.setCzsjzzy(PoiUtils.getStringValue(row.getCell(colIndex++)));//从事时间最长专业
				data.setCzsjzw(PoiUtils.getStringValue(row.getCell(colIndex++)));//从事时间最长岗位
				data.setScgwg3n(PoiUtils.getStringValue(row.getCell(colIndex++)));//生产岗位工作满3年
				data.setYxgwg3n(PoiUtils.getStringValue(row.getCell(colIndex++)));//营销岗位工作满3年
				data.setRyzhly(PoiUtils.getStringValue(row.getCell(colIndex++)));//荣誉-综合类荣誉
				data.setRyzyly(PoiUtils.getStringValue(row.getCell(colIndex++)));//荣誉-专业类荣誉
				data.setRyjtlry(PoiUtils.getStringValue(row.getCell(colIndex++)));//荣誉集体类荣誉
				data.setRyzgry(PoiUtils.getStringValue(row.getCell(colIndex++)));//荣誉-最高荣誉
				data.setRctchxtn(PoiUtils.getStringValue(row.getCell(colIndex++)));//人才称号-系统内
				data.setRctchxtw(PoiUtils.getStringValue(row.getCell(colIndex)));//人才称号-系统外

				// 处理单位
				NameTerm unitTerm = null;
				if (unit.length() > 0) {
					unitTerm = termMap.get(unit);// 单位
					if (unitTerm == null) {
						unitTerm = NameTerm.create(increment++, unit);
						termMap.put(unit, unitTerm);

						dataset.getTeams().add(unitTerm);
					}
					data.setUnit(unitTerm.getId());
					data.setUnitName(unit);
				}
				// 处理部门
				NameTerm departTerm = null;
				if (unitTerm != null && depart.length() > 0) {
					String mapDepart = this.catNames(unit, depart);
					departTerm = termMap.get(mapDepart);// 单位
					if (departTerm == null) {
						departTerm = NameTerm.create(increment++, depart);
						termMap.put(mapDepart, departTerm);
						
						unitTerm.getNodes().add(departTerm);
					}
					data.setDepart(departTerm.getId());
					data.setDepartName(depart);
				}
				// 处理班组
				NameTerm classTerm = null;
				if (departTerm != null && classGrp.length() > 0) {
					String mapClass = this.catNames(unit, depart, classGrp);
					classTerm = termMap.get(mapClass);// 单位
					if (classTerm == null) {
						classTerm = NameTerm.create(increment++, classGrp);
						termMap.put(mapClass, classTerm);
						
						departTerm.getNodes().add(classTerm);
					}
					data.setClassOrGroup(classTerm.getId());
					data.setGroupName(classGrp);
				}
				// 处理岗位
				if (job01.length() > 0) {
					String mapJob = this.catNames("(job)", job01);
					NameTerm jobTerm = termMap.get(mapJob);
					if (jobTerm == null) {
						jobTerm = NameTerm.create(increment++, job01);
						termMap.put(mapJob, jobTerm);

						dataset.getJobs().add(jobTerm);
					}
					data.setJob01(jobTerm.getId());
					data.setJob01Name(job01);
					//处理中类
//					if(job02.length()>0) {
//						mapJob = this.catNames(mapJob, job02);
//						NameTerm jobTerm02 = termMap.get(mapJob);
//						if (jobTerm02 == null) {
//							jobTerm02 = NameTerm.create(increment++, job02);
//							termMap.put(mapJob, jobTerm02);
//
//							jobTerm.getNodes().add(jobTerm02);
//						}
//						data.setJob02(jobTerm02.getId());
//						data.setJob02Name(job02);
//						if(job03.length()>0) {
//							mapJob = this.catNames(mapJob, job03);
//							NameTerm jobTerm03 = termMap.get(mapJob);
//							if (jobTerm03 == null) {
//								jobTerm03 = NameTerm.create(increment++, job03);
//								termMap.put(mapJob, jobTerm03);
//
//								jobTerm02.getNodes().add(jobTerm03);
//							}
//							data.setJob03(jobTerm03.getId());
//							data.setJob03Name(job03);
//						}
//					}
				}
				// 处理专业
				if (prof.length() > 0) {
					String mapProf = this.catNames("(prof)", prof);
					NameTerm profTerm = termMap.get(mapProf);
					if (profTerm == null) {
						profTerm = NameTerm.create(increment++, prof);
						termMap.put(mapProf, profTerm);

						dataset.getProfs().add(profTerm);
					}
					data.setTechLevel(profTerm.getId());
					data.setTechLevelName(prof);
				}

				dataset.getDatas().add(data);
			} catch (MindException me) {
				ret.addError("第" + index + "行:" + me.getMessage());
				e("解析人才开发管理预警上传数据文件失败", me);
			} catch (Exception ex) {
				ret.addError("第" + index + "行数据有错");
				e("解析人才开发管理预警上传数据文件失败", ex);
			}
		}

		return ret;
	}

}
